//
// Created by shanshi on 30/6/2025.
//
#include "thread_cache.h"

namespace memory_pool {
    void* thread_cache::allocate(size_t size) {
        if (size == 0) {
            // 至少分配一个对齐大小
            size = ALIGNMENT;
        }
        if (size > MAX_BYTES) {
            // 大对象直接从系统分配
            return malloc(size);
        }
        // 获取下标
        size_t index = SizeClass::getIndex(size);
        // 更新对应自由链表的长度计数
        free_list_sizes[index]--;
        void* ptr = nullptr;
        // 检查线程本地自由链表
        // 如果 freeList_[index] 不为空，表示该链表中有可用内存块
        if (ptr = free_list[index]) {
            free_list[index] = *reinterpret_cast<void**>(ptr);
            return ptr;
        }
        // 如果线程本地自由链表为空，则从中心缓存获取一批内存
        return fetch_from_central_cache(index);
    }
    void thread_cache::deallocate(void* ptr, size_t size) {
        if (size > MAX_BYTES) {
            free(ptr);
            return;
        }
        size_t index = SizeClass::getIndex(size);
        free_list[index] = ptr;
        free_list_sizes[index]++;
        // 检查是否需要归还内存给中心缓存
        if (should_tune(index)) {
            return_to_central_cache(free_list[index], size);
        }
    }
    void* thread_cache::fetch_from_central_cache(size_t index) {
        // 计算需要批量申请的内存块
    }
    // 归还内存给中心缓存
    void thread_cache::return_to_central_cache(void* start, size_t size) {
        // return_range(void* start, size_t size, size_t index)
        return;
    }
    size_t thread_cache::compute_num_to_fetch(size_t index) {
        // 计算需要批量申请的内存块
        size_t num = free_list_sizes[index] * 2;
        // 如果num大于等于256，则返回256
        if (num >= 256) {
            return 256;
        }
        // 否则返回num
        return num;
    }
    bool thread_cache::should_tune(size_t index) {
        // 如果自由链表长度大于等于256，则需要归还内存给中心缓存
        if (free_list_sizes[index] >= 256) {
            return true;
        }
        return false;
    }
}